Bit 연산자 사용하기

 

 Bit 연산자              ‘ | ‘(OR 연산자) , ‘ & ‘ (AND연산자), ‘ ^ ‘ ( XOR연산자) 의 세가지가 있다.

 

Bit 연산자는 WORD에 저장된 데이터들을 2진수로 변환하여 Bit 단위로 계산할 수 있도록 해준다.

 

예를 든다면 컨트롤러나 PLC에서 DIGITAL 입력신호를 잡아서 16개의 포인트를 한 개의 WORD에 저장한다고 가정해보자.

개발자는 이 신호를 각각의 PLC_SCAN디지털 입력태그를 16개를 등록하여 감시 화면상에서 볼 수 있을 것이다.

Bit 연산자와 관련 지어 생각하면 다른 방법으로도 가능하다. 즉, 디지털 신호 16개가 저장되어 있는 이 한 개의 WORD를 PLC_SCAN아날로그 입력태그로 설정하여 값을 불러와서 Bit 연산처리 하면 가능하다.

 

즉,  아래와 같이 처리해 주면 된다.

1) 예를 들어 PLC영역 M0000 WORD(앞으로 M0로 쓴다.)에 16개의 접점을 순서대로 저장하는데 만약, 16개의 접점이 모두 ON 되어있다면 M0의 값은 아래와 같다.

 

이진수 : 1111111111111111

십진수 : 65535

16진수 : FFFFh

 

위의 값이 될 것이고,

 

2) 0번Bit , 4번 Bit, 5번 Bit, 10번 Bit, 15번 Bit 가 ON되어 있다면 M0의 값은 아래와 같을 것이다.

 

이진수 : 1000010000110001

십진수 : 33841

16진수 : 8431h

 

위의 값이 될것이다.

 

2)번에서 이 값을 아날로그 입력태그로 설정하여 각각의 디지털 채널 값의 ON/OFF 상태를 나타내기 위해서는 아래와 같이 Bit연산자를 사용하면 된다.

 

M0의 WORD값을 PLC_SCN 아날로그 입력태그 AI_0000로 설정했다고 가정하고, 각각의 디지털 채널에 대하여 메모리 디지털 입력태그를 16개(DI_0000 ~DI_0016) 설정한다.

 

STATUS[0]=$AI_0000 & 1; //0번째 채널의 ON/OFF상태 검사

If ( STATUS[0] == 1) $DI_0000 = 1;

else $DI_0000 = 0;

 

STATUS[1]=$AI_0000 & 2; //1번째 채널의 ON/OFF상태 검사

If ( STATUS[1] == 2) $DI_0001 = 1;

else $DI_0001 = 0;

 

STATUS[2]=$AI_0000 & 4; //2번째 채널의 ON/OFF상태 검사

If ( STATUS[2] == 4) $DI_0002 = 1;

else $DI_0002 = 0;

 

STATUS[3]=$AI_0000 & 8; //3번째 채널의 ON/OFF상태 검사

If ( STATUS[3] == 8) $DI_0003 = 1;

else $DI_0003 = 0;

 

STATUS[4]=$AI_0000 & 16; //4번째 채널의 ON/OFF상태 검사

If ( STATUS[4] == 16) $DI_0004 = 1;

else $DI_0004 = 0;

 

STATUS[5]=$AI_0000 & 32; //5번째 채널의 ON/OFF상태 검사

If ( STATUS[5] == 32) $DI_0005 = 1;

else $DI_0005 = 0;

 

STATUS[6]=$AI_0000 & 64; //6번째 채널의 ON/OFF상태 검사

If ( STATUS[6] == 64) $DI_0006 = 1;

else $DI_0006 = 0;

 

STATUS[7]=$AI_0000 & 128; //7번째 채널의 ON/OFF상태 검사

If ( STATUS[7] == 128) $DI_0007 = 1;

else $DI_0007 = 0;

 

STATUS[8]=$AI_0000 & 256; //8번째 채널의 ON/OFF상태 검사

If ( STATUS[8] == 256) $DI_0008 = 1;

else $DI_0008 = 0;

 

STATUS[9]=$AI_0000 & 512; //9번째 채널의 ON/OFF상태 검사

If ( STATUS[9] == 512) $DI_0009 = 1;

else $DI_0009 = 0;

 

STATUS[10]=$AI_0000 & 1024; //10번째 채널의 ON/OFF상태 검사

If ( STATUS[10] == 1024) $DI_0010 = 1;

else $DI_0010 = 0;

 

STATUS[11]=$AI_0000 & 2048; //11번째 채널의 ON/OFF상태 검사

If ( STATUS[11] == 2048) $DI_0011 = 1;

else $DI_0011 = 0;

 

STATUS[12]=$AI_0000 & 4096; //12번째 채널의 ON/OFF상태 검사

If ( STATUS[12] == 4096) $DI_0012 = 1;

else $DI_0012 = 0;

 

STATUS[13]=$AI_0000 & 8192; //13번째 채널의 ON/OFF상태 검사

If ( STATUS[13] == 8192) $DI_0013 = 1;

else $DI_0013 = 0;

 

STATUS[14]=$AI_0000 & 16384; //14번째 채널의 ON/OFF상태 검사

If ( STATUS[14] == 16384) $DI_0014 = 1;

else $DI_0014 = 0;

 

STATUS[15]=$AI_0000 & 32768; //15번째 채널의 ON/OFF상태 검사

If ( STATUS[15] == 32768) $DI_0015 = 1;

else $DI_0015 = 0;

 

 

위와 같이 사용하면 한 개의 PLC_SCAN 아날로그 입력태그를 사용하여 16개의 디지털 접점을 볼 수 있게 된다.

 

출력을 하나의 워드로 내보내기 위해서는 다음과 같이 작성한다.

우선, 메모리 태그로 된 디지털 입력 태그 16개(OUTPUT00~OUTPUT15)를 작성한다. (이 디지털 입력 태그들은 메모리 태그로 작성하였기 때문에 이 입력 태그들을 ON/OFF하여도 스크립트를 작성하지 않으면 출력이 ON/OFF되지 않는다.)

다음에 이값들을 모아서 하나의 워드로 출력하기 위하여 아날로그 출력태그를 작성한다. (AIOUTPUT 아날로그 출력태그)

위와 같이 만든 후에 프로그램 버튼을 사용하여 다음과 같이 프로그램을 작성한다.

 

OUTPUT = 0;                                                                         // OUTPUT 이라는 WORD형의 변수를 할당한다. 초기값을 0으로 세팅해준다.

 

If ($OUTPUT00 == ON ) OUTPUT = OUTPUT+1;                       // 1번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 0번째 비트를 1로 만든다.

If ($OUTPUT01 == ON ) OUTPUT = OUTPUT+2;                       // 2번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 1번째 비트를 1로 만든다.

If ($OUTPUT02 == ON ) OUTPUT = OUTPUT+4;                       // 3번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 2번째 비트를 1로 만든다.

If ($OUTPUT03 == ON ) OUTPUT = OUTPUT+8;                       // 4번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 3번째 비트를 1로 만든다.

If ($OUTPUT04 == ON ) OUTPUT = OUTPUT+16;                     // 5번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 4번째 비트를 1로 만든다.

If ($OUTPUT05 == ON ) OUTPUT = OUTPUT+32;                     // 6번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 5번째 비트를 1로 만든다.

If ($OUTPUT06 == ON ) OUTPUT = OUTPUT+64;                     // 7번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 6번째 비트를 1로 만든다.

If ($OUTPUT07 == ON ) OUTPUT = OUTPUT+128;                   // 8번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 7번째 비트를 1로 만든다.

If ($OUTPUT08 == ON ) OUTPUT = OUTPUT+256;                   // 9번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 8번째 비트를 1로 만든다.

If ($OUTPUT09 == ON ) OUTPUT = OUTPUT+512;                   // 10번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 9번째 비트를 1로 만든다.

If ($OUTPUT10 == ON ) OUTPUT = OUTPUT+1024;                 // 11번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 10번째 비트를 1로 만든다.

If ($OUTPUT11 == ON ) OUTPUT = OUTPUT+2048;                 // 12번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 11번째 비트를 1로 만든다.

If ($OUTPUT12 == ON ) OUTPUT = OUTPUT+4096;                 // 13번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 12번째 비트를 1로 만든다.

If ($OUTPUT13 == ON ) OUTPUT = OUTPUT+8192;                 // 14번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 13번째 비트를 1로 만든다.

If ($OUTPUT14 == ON ) OUTPUT = OUTPUT+16384;                // 15번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 14번째 비트를 1로 만든다.

If ($OUTPUT15 == ON ) OUTPUT = OUTPUT+32768;                // 16번째 채널을 ON시키기 위하여 OUTPUT이라는 WORD의 15번째 비트를 1로 만든다.

 

$AIOUTPUT = OUTPUT;                                                        // OUTPUT 결과를 아날로그 출력 태그 AIOUTPUT 으로 넘겨서 출력을 한다.

 

 

위와 같이 작성을 하여 하나의 워드로 디지털 16개의 채널을 제어할 수 있다.